#1.导入一个FastAPI类
from fastapi import FastAPI,Response,Request
from fastapi.responses import FileResponse #FileResponse返回一个response允许静态资源
from fastapi.staticfiles import StaticFiles #将静态文件交给StaticFiles去托管
import uvicorn
#3.1导入前端模板类
from fastapi.templating import Jinja2Templates

#3.2创建Jinja2Templates对象,将templates托管
templates = Jinja2Templates(directory="templates")



from api.student import api_student
from api.user import api_user

'''
参数传递 前端---->后端
1.url a.params  2.路径   (get)
2.json 最常用的(post)
'''



#2.实例化FastAPI,作为核心的applacation
app = FastAPI()
app_son = FastAPI()
app.mount('/static',StaticFiles(directory='static'),name='static')
#path:将要访问static的前缀路径
#,StaticFiles(directory='static') 将static文件托管给子路由
app.mount('/son',app_son,name= '子路由')

#包含一个子路由,而不是挂载
app.include_router(api_student,prefix='/student',tags=['学生接口'])
app.include_router(api_user,prefix='/user',tags=['用户接口'])


@app_son.get('/111')
def t_111():
    return 111



#3.写接口,托管给fastapi,去分配映射
@app.get("/")
def init(request:Request,name:str):
    return templates.TemplateResponse(request= request, #请求域,请求的所有信息转发给
                                      name = 'welcome.html',#选择的模拟
                                      context={'name':name,
                                               'data':{'code':1001,
                                                       'msg':'请求成功啦'
                                                       }}
                                      )

#通过路径传参,以参数直接接收,方式
#1.params形式,url路径?后的部分 hello?name=吴彦祖
#2.将参数写入路径中,mapping中(hello/{name})接收 user/Bob
@app.get('/hello')
def hello(name):
    '''
    前端发送 http://127.0.0.1:8000/hello时,映射到此函数,函数执行,并且返回资源
    :param name:从前端传入的值,一般通过url来传值 http://127.0.0.1:8000/hello?name=吴彦祖
    :return: 拼接好name的值
    '''
    return 'hello '+name
@app.get('/user/{name}')
def find(name):
    return {'id':1001,'name':name}

#2.3.写接口,
# a.post/put请求
# b.参数直接用类型接收 post_hello(student:Student):


@app.get('/favicon.ico')
def get_file():
    '''
    每一个静态文件都要写一个接口,麻烦
    :return:
    '''
    return FileResponse('static/1.png')



'''
把数据传给前端
1.json 默认返回的就是转化的json
    json JavaScript下类似Object的数据传输的格式的字符串---->对象(反序列化) --->字符串(序列化)
    (int string object array) :  {"name":"Alice","age":19}  []
2.可以返回资源文件
    

'''

#4.部署到服务器运行
if __name__ == '__main__':
    uvicorn.run("main:app")
